import pymysql
import contextlib
import datetime


class SqlTools(object):
    '''
    数据库类也可以使用django数据库models，web服务器可选择django也可选择flask。
    本实例采用原生mysql，拆分为多个sql方法为提高执行效率
    Author: AnyeV
    '''

    # 初始化数据
    def __init__(self):
        self.__host = ''
        self.__port = 0
        self.__user = ''
        self.__passwd = ''

    # 建立mysql链接上下文
    @contextlib.contextmanager
    def __connect_db(self, db_name):
        connect = pymysql.Connect(
            host=self.__host,
            port=self.__port,
            user=self.__user,
            passwd=self.__passwd,
            db=db_name,
            charset='utf8'
        )
        cursor = connect.cursor()
        try:
            yield cursor
        finally:
            connect.commit()
            cursor.close()
            connect.close()

    # 查询
    def select_data(self, sql, db_name):
        res = []
        with self.__connect_db(db_name) as cursor:
            cursor.execute(sql)
            collection = cursor.fetchall()
            len_collection = len(collection)
            if len_collection > 0:
                for row in collection:
                    res.append(row)
            else:
                pass
        return res

    # 更新
    def update_data(self, sql, db_name):
        with self.__connect_db(db_name) as cursor:
            effect_no = cursor.execute(sql)
            return effect_no

    # 插入
    def insert_data(self, sql, db_name):
        with self.__connect_db(db_name) as cursor:
            effect_no = cursor.execute(sql)
            return effect_no

    # 格式化字符串
    def to_strings(self, strings):
        return '"' + str(strings) + '"'

    # 获取当前时间
    def get_time(self):
        return datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

    # 查询设备状态
    def select_equip(self, connector_id):
        '''
        :param connector_id: 设备编号
        :return: 设备状态
        '''

    # 插入订单
    def insert_order(self, order_data, operator_id):
        '''
        :param order_data: 需要插入的订单数据
        :param operator_id: 运营商id
        :return: 插入结果
        '''

    # 获取订单信息
    def get_order_info(self, order_id):
        '''
        :param order_id: 订单id
        :return: 需要的订单信息
        '''

    # 获取枪类型
    def get_connector_type(self, connector_id):
        '''
        :param connector_id: 设备编号
        :return: 设备类型
        '''

    # 获取计费策略
    def get_policy(self, charge_type):
        '''
        :param charge_type: 设备类型
        :return: 计费策略
        '''

    # 保存运营商token
    def save_token(self, _token, token_type):
        '''
        :param _token: token字符串
        :param token_type: token类型（运营商或服务平台编号）
        :return: 保存结果，成功或失败
        '''

    # 获取运营商token
    def get_token(self, token_type):
        '''
        :param token_type: token类型（运营商或服务平台编号）
        :return: token字符串
        '''

    # 获取当前时段计费策略
    def get_now_policy(self, charge_type):
        '''
        :param charge_type: 设备类型（直流、交流等）
        :return: 计费策略
        '''

    # 更新订单状态
    def update_order_data(self, order_data):
        '''
        :param order_data: 需要更新的订单数据
        :return: 更新结果（成功或失败）
        '''

    # 更新订单状态
    def update_order_status(self, order_id, order_status, end_charge_time):
        '''
        :param order_id: 订单id
        :param order_status: 订单状态
        :param end_charge_time: 结束充电时间
        :return: 更新结果（成功或失败）
        '''

    # 根据运营商id获取配置信息
    def get_imitator_config(self, operator_id=None):
        '''
        :param operator_id: 运营商id
        :return: 运营商设置
        '''

    # 查询充电站下枪
    def get_connector_by_station(self, station_id):
        '''
        :param station_id: 充电站id
        :return: 枪列表
        '''

    # 更新运营商配置-更新运营商
    def update_imitator_operator(self, operator_dict):
        '''
        :param operator_dict: 更新data
        :return: 更新结果（成功或失败）
        '''

    # 更新运营商配置-更新设置
    def update_imitator_config(self, kwarges):
        '''
        :param kwarges: 更新运营商设置data
        :return: 更新结果（成功或失败）
        '''

    # 获取设备运营商id
    def get_operator_id_by_connector(self, connector_id):
        '''
        :param connector_id: 设备编号
        :return: 运营商id
        '''

    # 根据订单id获取运营商id
    def get_operator_id_by_order(self, order_id):
        '''
        :param order_id: 订单id
        :return: 运营商id
        '''
